Skip to content

Linux 定时任务:cron 与 systemd timer ​

以「每天凌晨 5 点定时重启」为例,对比 Linux 下两种定时任务的配置方法:crontab 简单直接,是大多数日常场景的首选;systemd timer 步骤稍多,但更结构化,适合与系统服务深度集成的任务。读完可以直接照抄两种配置,并知道什么场景选哪个。已部署任务的完整移除流程见 systemd 定时任务与服务清理。

方法一:crontab(推荐,最常用) ​

  1. 编辑 root 用户的 crontab(重启需要 root 权限):
bash
sudo crontab -e

第一次操作时会让你选择默认编辑器。

  1. 在文件末尾添加一行:
0 5 * * * /sbin/reboot
  • 0 5 * * *:五个字段依次为 分 时 日 月 周,即每天凌晨 5 点整
  • /sbin/reboot:要执行的命令,写绝对路径
  1. 保存退出:vim 按 Esc 后输入 :wq 回车;nano 按 Ctrl+X,按 Y 确认,回车保存。

  2. 验证任务已添加:

bash
sudo crontab -l

方法二:systemd timer ​

  1. 创建 service 文件 /etc/systemd/system/daily-reboot.service,定义「执行什么」:
ini
[Unit]
Description=Daily Reboot

[Service]
Type=oneshot
ExecStart=/usr/sbin/reboot

Type=oneshot 表示一次性任务,执行完即退出。

  1. 创建同名 timer 文件 /etc/systemd/system/daily-reboot.timer,定义「何时执行」:
ini
[Unit]
Description=Triggers a daily reboot at 5:00 AM

[Timer]
OnCalendar=*-*-* 05:00:00
Persistent=true

[Install]
WantedBy=timers.target
  • OnCalendar=*-*-* 05:00:00:年-月-日 05:00:00,即每天凌晨 5 点
  • Persistent=true:若触发时刻系统处于关机状态,下次开机后立即补执行一次
  1. 启用并启动 timer:
bash
# 重新加载 systemd 配置,使其识别新文件
sudo systemctl daemon-reload

# 启用(开机自动激活)并启动
sudo systemctl enable daily-reboot.timer
sudo systemctl start daily-reboot.timer
  1. 验证:
bash
sudo systemctl status daily-reboot.timer
sudo systemctl list-timers

日历表达式可用 systemd-analyze calendar "*-*-* 05:00:00" 验证,会输出规范化形式和下次触发时间。

方法对比 ​

特性 crontab systemd timer
简单性 一行配置 需创建 service + timer 两个文件
日志 /var/log/syslog 或 journalctl journalctl -u xxx.service,更清晰
灵活性 时间语法成熟灵活 同样强大,另支持单调定时器(相对启动时间)
依赖管理 弱 强,可定义与其他服务的依赖关系
适用场景 绝大多数日常自动化任务 与系统服务深度集成的复杂任务

要点 ​

  • 一行搞定、与系统服务无关的任务用 crontab;需要依赖管理、精确日志、错过的触发补执行(Persistent=true)时用 systemd timer
  • systemd timer 的 service 与 timer 必须同名,daemon-reload 不可省
  • 日历表达式拿不准时,先用 systemd-analyze calendar 验证再写入配置
最近更新

基于 VitePress 构建